ASP.NET MVC/WebApi 路由中包含英文句号(.)的问题.
今天接到一个需求,要求 app 内的深度链接使用 http-url 的格式来定义,以便当 app 版本不够高,无法识别较新的深度链接的时候,可以将深度链接退化为一个http请求,打开一个升级页面。
深度链接的格式为:
我寻思着,虽然好久没有写过 MVC 了,但不就是配个路由的事儿吗,应该不难:
routes.MapRoute("DeepLink",
"link/{linkId}",
new { controller = "DeepLink", action = "Index" }
);
然而,跑起来之后发现直接 404,细看了一下 404 页面,发现使用的是 StaticFileHandler
,难道是被当成静态文件了?
嗯。。。也对,本质上 这个深度链接可以简化为
该包含的要素一个都没少,所以被解析成静态文件也就不奇怪了,那么怎么改呢?
方案一、 修改 web.config 中的 modules
这也是网上被提及最多的方法,但是个人非常不推荐这种方法,因为这种修改会导致所有的请求(包括对静态文件的请求)全部都会被iis中已注册的模块接管,这其实非常没有必要。
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<system.webServer>
</configuration>
方案二、 向 web.config 中添加 handlers
<configuration>
<system.webServer>
<handlers>
<add name="DeepLinkHandler-ISAPI-4.0_32bit" path="link/*.*" verb="GET" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="DeepLinkHandler-ISAPI-4.0_64bit" path="link/*.*" verb="GET" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="DeepLinkHandler-Integrated-4.0" path="link/*.*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>
其实,我们只需要 handlers 中添加上述3个handler即可,从代码中很容易看出,这只针对打向指定Url(link/*.*
)的指定请求(GET
)生效。